#pragma once 

#include <string>
#include <unordered_map>
#include <stdexcept>

using std::string;
using std::unordered_map;

class Config
{
public:
    explicit Config(const string &filename);

    Config(const Config &) = delete;
    Config &operator=(const Config &) = delete;

    // 日志配置
    struct LogConfig{
        string log_path;
        long max_file_size;
        int max_file_num;

        explicit LogConfig(const Config &cf);
    };

    // 获取配置
    string getString(const string &key, const string &default_val = "") const;
    int getInt(const string &key, int default_val = -1) const;
    long getLong(const string &key, int default_val = -1) const;
    bool getBool(const string &key, int default_val = false) const;

    //debug
    void printConfigMap() const;
private:
    unordered_map<string, string> _configMap;

    void parseFile(const string &filename); // 解析文件
    string trim(const string &str);         // 过滤字符串

    int evaluate_expression(const string &expr) const;
};